本次作业为移动端 VR 实验,将基于 Google Cardboard VR 设备,在移动设备上开发一款简单的游戏。在本次作业中,同学们将了解 Google VR 开发包,并学习如何使用它来开发简单的 Cardboard 应用。
如果你使用的是 Unity Hub 管理 Unity 版本,请按如下过程安装 Android/IOS Build Support。
以 Android 平台为例,如果你没有使用 Unity Hub,则需要手动配置Android相关SDK。请参照该文档来安装 Android Build Support。
File->Build Settings
,在Platform中选择Android,并点击右下角 Switch Platform 来切换平台Other Settings->Identification
下的Package Name
和 Minimum API Level
。Minimum API Level
需要设置为 19 以上。Build Settings
中选中 Build
打包为apk,并在 Android 手机中运行。(也可以将手机连接电脑,在USB调试模式下点击 Build and Run
进行调试。)运行成功即表示环境配置完成。我们通过构建一个简单的游戏来了解 Google VR SDK 的基础用法。
新建一个空白3D Unity项目,导入Google VR SDK。
在 File->Build Settings->Player Settings->XR Settings
中选中 Virtual Reality Supported
,并在 Virtual Reality SDK
中添加 Cardboard
。
新建空物体名为 Player ,位于(0,0,0)
,设置 Main Camera 为其子物体。注意 Main Camera->Transform->position=(0,0,0)
。
为Main Camera添加 GvrPointerPhysicsRaycaster
组件。该组件使之能和场景中的物体交互
在项目目录中搜索并添加 GvrEditorEmulator
预设体。该预设体使得 Unity Editor 可以模拟VR环境下的头部运动,便于在 Editor 中调试。
在项目目录中搜索并添加 GvrEventSystem
预设体。该预设体使游戏能追踪点击、悬停等事件。
在项目目录中搜索并添加 GvrReticlePointer
预设体,作为 Camera 的子物体。该预设体在游戏中显示为准星,使得用户能利用它在场景物体上点击、悬停。
新建一个 Cube 物体,位置为 (3,4,0)
。
ReticleTest.cs
。脚本中添加一个共有函数 RandomlyTeleport()
,该函数能让 Cube 传送到一个随机位置: public void RandomlyTeleport(){
var rad = Random.Range(0, 6.18f);
var r = 5.0f;
gameObject.transform.position = new Vector3(
Mathf.Sin(rad)*r, Random.Range(-0.5f, 0.5f), Mathf.Cos(rad)*r
);
}
Event Trigger
脚本,并在 Pointer Click
下绑定当前物体的 RandomlyTeleport
函数。此时,当玩家点击 Cube 时,便会调用到 ReticleTest.RandomlyTeleport
函数,使 Cube 被传送到下一个随机位置。接下来,你需要利用 Cardboard 的特点,设计实现一个新颖的游戏。
用户交互:在 Cardboard 中,我们获取的用户输入只有头盔的旋转信息以及一个点击事件。其中头盔的旋转可以通过 Main Camera->Transform
计算得到,点击事件可以通过上一章的方法实现。
VR中的UI:在VR环境中,由于头部会经常性地转动,因此常常会使用固定位置的UI。 为实现固定位置的UI,需要将Canvas->Canvas Render Mode
设置为 WorldSpace 。对于过大的 Canvas ,建议使用 Scale 来调整其大小,以保证 Canvas 中的 UI 有足够分辨率显示。